package cn.tedu.truetaste.service.impl;

import cn.tedu.truetaste.ex.ServiceException;
import cn.tedu.truetaste.mapper.TableMapper;
import cn.tedu.truetaste.pojo.dto.TableAddNewDTO;
import cn.tedu.truetaste.pojo.dto.TableUpdateDTO;
import cn.tedu.truetaste.pojo.entity.Table;
import cn.tedu.truetaste.pojo.vo.StoreListItemVO;
import cn.tedu.truetaste.pojo.vo.TableListItemVO;
import cn.tedu.truetaste.pojo.vo.TableStandardVO;
import cn.tedu.truetaste.service.ITableService;
import cn.tedu.truetaste.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class TableServiceImpl implements ITableService {
    @Autowired
    private TableMapper tableMapper;

    @Override
    public void addNew(TableAddNewDTO tableAddNewDTO) {
        log.debug("开始处理【添加餐桌】的业务，参数：{}", tableAddNewDTO);
        String codeId = tableAddNewDTO.getCodeId();
        int code = tableMapper.countByCodeId(codeId);
        // 判断图片所属菜品是否存在
        if (code >0) {
            // 是：菜品名称已经存在，抛出RuntimeException异常
            String message = "添加餐桌失败！餐桌二维码已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 准备需要添加到数据库的对象
        Table table = new Table();
        BeanUtils.copyProperties(tableAddNewDTO, table);

        // 执行插入数据
        int rows = tableMapper.insert(table);
        if (rows != 1) {
            String message = "添加餐桌失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【删除餐桌】的业务，参数：{}", id);
        // 检查尝试删除的餐桌是否存在
        Object queryResult = tableMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除餐桌失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        int rows = tableMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除餐桌失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
        log.debug("删除完成！");
    }

    @Override
    public void updateInfoById(Long id, TableUpdateDTO tableUpdateDTO) {
        log.debug("开始处理【修改餐桌详情】的业务，参数ID：{}，新数据：{}",id, tableUpdateDTO);

        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            TableStandardVO tables = tableMapper.getStandardById(id);
            // 是：数据不存在，抛出异常
            if (tables == null) {
                String message = "修改餐桌详情失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        {
            // 调用Mapper的countByCodeIdAndNotId()执行查询，检查新的名称是否已经被别的数据占用
            int count = tableMapper.countByCodeIdAndNotId(id, tableUpdateDTO.getCodeId());
            // 是：名称被别的数据占用，抛出异常（NOT_CONFLICT）
            if (count > 0) {
                String message = "修改餐桌详情失败，新的餐桌二维码已经被占用！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建Store对象
        Table table = new Table();
        // 将参数对象的属性值复制到以上新创建的Store对象中
        BeanUtils.copyProperties(tableUpdateDTO, table);
        table.setId(id);
        // 调用Mapper的update(Table table)方法执行修改
        log.debug("即将执行修改数据，参数：{}", table);
        int rows = tableMapper.update(table);
        if (rows != 1) {
            String message = "修改餐桌详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public TableStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询餐桌详情】的业务，参数：{}", id);

        // 调用Mapper的getStandardById()执行查询
        TableStandardVO store = tableMapper.getStandardById(id);
        // 判断查询结果是否为null
        // 是：没有匹配的数据，抛出异常（NOT_FOUND）
        if (store == null) {
            String message = "查询餐桌详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("即将返回查询结果：{}", store);
        return store;
    }

    @Override
    public List<TableListItemVO> list() {
        log.debug("开始处理【查询餐桌列表】的业务，无参数");
        List<TableListItemVO> list = tableMapper.list();
        log.debug("即将返回查询结果：{}", list);
        return list;
    }
}
